home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
CC_C
/
0574.ZIP
/
FIDOUNIX.C
< prev
next >
Wrap
C/C++ Source or Header
|
1986-08-12
|
13KB
|
544 lines
static char *RCSid = "$Header: fidounix.c 1.3 86/07/31 23:03:06 rch Exp $";
/*
$Source: BOB/USENET/FIDO/fidounix.c%v $
This file is part of the UN*X Gateway Fido/UNIX code.
This implements sending Fido messages to UNIX.
*/
/*
* $Log: fidounix.c $
* Revision 1.3 86/07/31 23:03:06 rch
* Support stupid SEAdog hard and soft returns.
*
* Revision 1.2 85/12/15 13:27:20 rch
* Added support for MAILER-DAEMON return of messages
*
* Revision 1.1 85/12/10 01:45:50 rch
* Initial revision
*
*/
#include <stdio.h>
#include <fcntl.h>
#include <stat.h>
#include <dos.h>
/* Fido Message structure */
typedef struct {
char from[36]; /* who from */
char to[36]; /* who to */
char subj[72]; /* message subject */
char date[20]; /* creation date */
int times; /* number of times read */
int dest; /* destination node */
int orig; /* originating node */
int cost; /* actual cost of msg */
int orig_net; /* originating net */
int dest_net; /* destination net */
int caca[4]; /* extra space */
int reply; /* thread to previous message */
int attr; /* message type, below */
int up; /* thread to next message */
}
MSG, *MSG_PTR;
char *fgets(s, n, fp)
char *s; FILE *fp;
{
register c;
register char *cp;
char c1;
cp = s;
while (--n > 0 && (c = getc(fp)) != EOF) {
if (c == '\r')
{
c1 = getc(fp);
if (c1 == '\r')
c = '\n';
else
ungetc (c1, fp);
}
if (c == 0x8d)
{
c = '\n';
c1 = getc(fp);
if (c1 != '\n')
ungetc (c1, fp);
}
*cp++ = c;
if (c == '\n')
break;
}
*cp = 0;
if (c == EOF && cp == s)
return NULL;
return(s);
}
main (argc, argv)
int argc;
char *argv[];
{
FILE *input, *output;
char *tmp, buf[BUFSIZ], tmp1[1000], tmp2[100], filename[20], mailto[128];
char fm[36], *f, newname[20];
extern char *mktemp(), *gets();
long size, size1, lines;
int i, orphan;
MSG msg;
filedir ("*.MSG", 0, filename);
while (filename[0] != '\0')
{
printf ("%s ", filename);
orphan = 0;
if ((input = fopen (filename, "r+")) == NULL)
continue;
fread (&msg, 1, sizeof (MSG), input);
if (strcmp (msg.to, "Usenet") != 0)
{
if (strcmp (msg.from, "Usenet") != 0)
{
fclose (input);
printf ("not a message to or from 'Usenet'\n");
filedir ("*.MSG", 1, filename);
continue;
}
else
{
if (msg.attr & 64)
return_mail(&msg, filename, input);
else
{
printf ("is from Usenet and is ok\n");
fclose (input);
}
filedir ("*.MSG", 1, filename);
continue;
}
}
printf ("%s is a message to 'Usenet': ", filename);
if (msg.attr & 8)
{
printf ("already sent\n");
fclose (input);
filedir ("*.MSG", 1, filename);
continue;
}
msg.attr = 9;
if (fgets (mailto, BUFSIZ, input) == NULL)
{
fseek (input, 0L, 0);
fwrite (&msg, 1, sizeof (MSG), input);
fclose (input);
printf ("%s has no characters in it!\n", filename);
filedir ("*.MSG", 1, filename);
continue;
}
f = mailto;
while (*f != '\0')
if ((*f == 10) || (*f == 13) || (*f == 138) || (*f == 141))
*f = '\0';
else
++f;
size = 0;
tmp = mktemp ("junkXXXX.XX");
output = fopen (tmp, "w");
get_date ("%w %n %d %Y", tmp2);
get_time ("%h:%m:%s", &tmp2[11]);
strcpy (fm, msg.from);
f = fm;
while (*f != '\0')
if (*f == ' ')
*f++ = '_';
else
f++;
sprintf (tmp1, ">From %d!%d!%s %s remote from spark\n", msg.orig_net,
msg.orig, fm, tmp2);
fprintf (output, tmp1);
size += strlen (tmp1);
sprintf (tmp1, "From: spark!%d!%d!%s\n", msg.orig_net, msg.orig, fm);
fprintf (output, tmp1);
size += strlen (tmp1);
sprintf (tmp1, "To: %s", mailto);
fprintf (output, "%s\n", tmp1);
size += strlen (tmp1) + 1;
sprintf (tmp1, "Subject: %s\n", msg.subj);
fprintf (output, "%s\n", tmp1);
size += strlen (tmp1) + 1;
while (fgets (buf, BUFSIZ, input) != NULL)
{
fprintf (output, "%s", buf);
size += strlen (buf);
}
fclose (output);
fseek (input, 0L, 0);
fwrite (&msg, 1, sizeof (MSG), input);
fclose (input);
sprintf (tmp1, "#! MAIL-%s %ld\r\n", mailto, size);
printf ("Sending mail to %s\n", mailto);
filecopy (tmp, tmp1);
unlink (tmp);
unlink (filename);
filedir ("*.MSG", 1, filename);
}
}
filecopy (oldname, str)
char *oldname, *str;
{
int in, out, c;
char buf[BUFSIZ];
char newname[100];
strcpy (newname, "C:/FIDO/VAXINE/REPLY.1");
in = open (oldname, O_RDONLY);
out = open (newname, O_CREAT+O_WRONLY+O_APPEND);
write (out, str, strlen (str));
while ((c = read (in, buf, BUFSIZ)) == BUFSIZ)
write (out, buf, BUFSIZ);
if (c != 0)
write (out, buf, c);
close (in);
close (out);
}
/*
date.c
Author: Bob Hartman
Date: 6-5-85
This file implements a standardized date routine which is
callable from Manx AZTEC C-86 compiler. The format string
determines the way the date is to be formatted as follows:
%n - 3 character month name
%N - Full month name
%m - Month as 2 digits (zero filled if necessary)
%d - Day as 2 digits (zero filled if necessary)
%w - 3 character day of week name
%W - Full day of week name
%y - Year as 2 digits
%Y - Year as 4 digits
A % not followed by one of the above is ignored.
All other characters in the format specifier are
copied to the output string.
*/
/* Character used to delimit format specifiers in format strings */
#define ESCAPE_CHAR '%'
#define DOSINT 0x21
/* Month names for date() function */
static char *_months[12] = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
/* Day of week names for date() function */
static char *_days[7] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};
/*
date (fmt, d)
char *fmt;
char *d;
returns in d, the current date in the form specified by the fmt string
*/
get_date (fmt, d)
register char *fmt;
register char *d;
{
union REGS inregs, outregs;
char temp[5]; /* To hold date so it can be processed again */
int w, y, m, d1;
inregs.x.ax = 0x2a00;
(void) sysint (DOSINT, &inregs, &outregs);
w = outregs.h.al;
y = outregs.x.cx;
m = outregs.h.dh;
d1 = outregs.h.dl;
/* Now go through the format string */
while (*fmt != '\0')
{
if (*fmt != ESCAPE_CHAR)
*d++ = *fmt;
else
{
switch (*(++fmt))
{
case 'n':
sprintf (d, "%.3s", _months[m - 1]);
d += 3;
break;
case 'N':
sprintf (d, "%s", _months[m - 1]);
d += strlen (d);
break;
case 'm':
sprintf (d, "%02d", m);
d += 2;
break;
case 'd':
sprintf (d, "%02d", d1);
d += 2;
break;
case 'w':
sprintf (d, "%.3s", _days[w]);
d += 3;
break;
case 'W':
sprintf (d, "%s", _days[w]);
d += strlen (d);
break;
case 'y':
sprintf (temp, "%04d", y);
sprintf (d, "%.2s", temp+2);
d += 2;
break;
case 'Y':
sprintf (d, "%04d", y);
d += 4;
break;
default:
*d++ = *fmt;
}
}
++fmt;
}
*d = '\0'; /* Just to be sure that it is null terminated */
}
/*
time.c
Author: Robert Hartman
Date: 6-5-85
This file implements a standardized time routine which is
callable from Manx AZTEC C-86 compiler. The format string
determines the way the time is to be formatted as follows:
%h - 2 digits for hours (24 hour clock)
%H - 2 digits for hours (12 hour clock)
%m - 2 digits for minutes
%s - 2 digits for seconds
%t - 2 digits for hundredths of a second
%i - am/pm indicator
%I - AM/PM indicator
A % not followed by one of the above is ignored.
All other characters in the format specifier are
copied to the output string.
*/
/* Character used to delimit format specifiers in format strings */
#define ESCAPE_CHAR '%'
#define DOSINT 0x21
/*
time (fmt, t)
char *fmt;
char *t;
returns in t, the current time in the form specified by the fmt string
*/
get_time (fmt, t)
register char *fmt;
register char *t;
{
union REGS inregs, outregs;
int h, m, s, ms;
inregs.x.ax = 0x2c00;
(void) sysint (DOSINT, &inregs, &outregs);
h = outregs.h.ch;
m = outregs.h.cl;
s = outregs.h.dh;
ms = outregs.h.dl;
/* Now go through the format string */
while (*fmt != '\0')
{
if (*fmt != ESCAPE_CHAR)
*t++ = *fmt;
else
{
switch (*(++fmt))
{
/* hours (24 hour clock) */
case 'h':
sprintf (t, "%02d", h);
t += 2;
break;
/* hours (12 hour clock) */
case 'H':
sprintf (t, "%02d", (h % 12) ? (h % 12) : 12);
t += 2;
break;
/* minutes */
case 'm':
sprintf (t, "%02d", m);
t += 2;
break;
/* seconds */
case 's':
sprintf (t, "%02d", s);
t += 2;
break;
/* hundredths of a second */
case 't':
sprintf (t, "%02d", ms);
t += 2;
break;
/* am/pm indicator */
case 'i':
sprintf (t, "%s", (h < 12) ? "am" : "pm");
t += 2;
break;
/* AM/PM indicator */
case 'I':
sprintf (t, "%s", (h < 12) ? "AM" : "PM");
t += 2;
break;
default:
*t++ = *fmt;
}
}
++fmt;
}
*t = '\0'; /* Just to be sure that it is null terminated */
}
filedir (name, times, ret_str)
char *name;
int times;
char *ret_str;
{
static struct {
char rsvd[21];
char attr;
long ftime;
long fsize;
char fname[13];
}
sbuf;
bdos (0x1a, &sbuf);
if (times == 0) {
if (dos (0x4e, 0, ~ST_VLABEL, name, 0, 0) == -1)
sbuf.fname[0] = '\0';
strcpy (ret_str, sbuf.fname);
}
else {
if (dos (0x4f, 0, ~ST_VLABEL, name, 0, 0) == -1)
sbuf.fname[0] = '\0';
strcpy (ret_str, sbuf.fname);
}
}
return_mail(msg, filename, input)
MSG_PTR msg;
char *filename;
FILE *input;
{
FILE *output;
char *tmp, buf[BUFSIZ], tmp1[1000], tmp2[100], mailto[128];
char fm[36], *f, newname[20];
extern char *mktemp(), *gets();
long size, size1, lines;
int i, orphan;
printf ("is from Usenet and is an orphan: ");
for (;;)
{
if (fgets (mailto, BUFSIZ, input) == NULL)
{
fseek (input, 0L, 0);
fwrite (&msg, 1, sizeof (MSG), input);
printf ("no From: line\n");
fclose (input);
return;
}
if (strncmp (mailto, "From: ", 6) == 0)
break;
}
f = &mailto[6];
f = mailto;
while (*f != '\0')
if ((*f == 10) || (*f == 13) || (*f == 138) || (*f == 141))
*f = '\0';
else
++f;
size = 0;
tmp = mktemp ("junkXXXX.XX");
output = fopen (tmp, "w");
get_date ("%w %n %d %Y", tmp2);
get_time ("%h:%m:%s", &tmp2[11]);
strcpy (fm, msg->from);
f = fm;
while (*f != '\0')
if (*f == ' ')
*f++ = '_';
else
f++;
sprintf (tmp1, ">From MAILER-DAEMON %s remote from spark\n", tmp2);
fprintf (output, tmp1);
size += strlen (tmp1);
sprintf (tmp1, "From: spark!MAILER-DAEMON\n");
fprintf (output, tmp1);
size += strlen (tmp1);
sprintf (tmp1, "To: %s", &mailto[6]);
fprintf (output, "%s\n", tmp1);
size += strlen (tmp1)+1;
sprintf (tmp1, "Subject: Returned mail - Fido node non-existant\n");
fprintf (output, "%s\n", tmp1);
size += strlen (tmp1);
sprintf (tmp1, " ----- Transcript of session follows -----\n");
fprintf (output, "%s", tmp1);
size += strlen (tmp1);
sprintf (tmp1, "\n %d!%d - Fido node non-existant\n\n", msg->dest_net, msg->dest);
fprintf (output, "%s", tmp1);
size += strlen (tmp1);
sprintf (tmp1, " ----- Unsent message follows -----\n\n");
fprintf (output, "%s", tmp1);
size += strlen (tmp1);
fprintf (output, "%s\n", mailto);
size += strlen (mailto)+1;
sprintf (tmp1, "To: %d!%d!%s\n", msg->dest_net, msg->dest, msg->to);
fprintf (output, "%s", tmp1);
size += strlen (tmp1);
while (fgets (buf, BUFSIZ, input) != NULL)
{
fprintf (output, "%s", buf);
size += strlen (buf);
}
fclose (output);
fseek (input, 0L, 0);
fwrite (&msg, 1, sizeof (MSG), input);
fclose (input);
sprintf (tmp1, "#! MAIL-%s %ld\r\n", &mailto[6], size);
printf ("Sending mail back to %s\n", &mailto[6]);
filecopy (tmp, tmp1);
unlink (tmp);
unlink (filename);
}